import sys
import socket

WHOIS_SERVERS = {
    "biz": "whois.neulevel.biz",
    "com": "whois.internic.net",
    "us": "whois.nic.us",
    "coop": "whois.nic.coop",
    "info": "whois.nic.info",
    "name": "whois.nic.name",
    "net": "whois.internic.net",
    "gov": "whois.nic.gov",
    "edu": "whois.internic.net",
    "mil": "rs.internic.net",
    "int": "whois.iana.org",
    "ac": "whois.nic.ac",
    "ae": "whois.uaenic.ae",
    "at": "whois.ripe.net",
    "au": "whois.aunic.net",
    "be": "whois.dns.be",
    "bg": "whois.ripe.net",
    "br": "whois.registro.br",
    "bz": "whois.belizenic.bz",
    "ca": "whois.cira.ca",
    "cc": "whois.nic.cc",
    "ch": "whois.nic.ch",
    "cl": "whois.nic.cl",
    "cn": "whois.cnnic.net.cn",
    "cz": "whois.nic.cz",
    "de": "whois.nic.de",
    "fr": "whois.nic.fr",
    "hu": "whois.nic.hu",
    "ie": "whois.domainregistry.ie",
    "il": "whois.isoc.org.il",
    "in": "whois.ncst.ernet.in",
    "ir": "whois.nic.ir",
    "mc": "whois.ripe.net",
    "to": "whois.tonic.to",
    "tv": "whois.tv",
    "ru": "whois.ripn.net",
    "org": "whois.pir.org",
    "aero": "whois.information.aero",
    "eu": "whois.eu",
    "nl": "whois.domain-registry.nl"
}

class WhoisError(Exception):
    
    def __init__(self, value):
        self.value = value
    
    def __str__(self):
        return repr(self.value)

def whois(domain):
    """
    Retrieves data from whois-servers about a domain
    """
    # Get TLD:
    i = domain.rfind(".")
    
    if i == -1:
        raise WhoisError('Not a valid domain')
    tld = domain[i+1:]
    if tld[-1:] == "/":
        tld = tld[0:-1]
    if tld not in WHOIS_SERVERS:
        raise WhoisError('No whois-server found for TLD .%s' % tld)
    
    # Connect to server for this TLD and get results
    server = WHOIS_SERVERS[tld]
    res = ''
    
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((server, 43))
        s.send(domain + '\r\n')
        
        while True:
            d = s.recv(4096)
            res += d
            if d == '':
                break
        
        s.shutdown(socket.SHUT_RDWR)
        s.close()
    except (socket.error, socket.herror, socket.gaierror, socket.timeout):
        raise WhoisError('Error with connection to whois-server %s, please contact the webmaster' % server)
    
    return res